/*
 * ContentManager
 *
 * Gestore dei DOM.
 */


function ContentManager () {

	var DOMStorage;


	/*
	 * Ritorna il DOM individuato da name.
	 */
	this.get = function (name) {
		assert (name in DOMStorage, "ContentManager.get: " + name + " non esiste.");
		return DOMStorage[name];
	}


	/*
	 * Mette il DOM al posto giusto, basandosi sul nome del DOM.
	 */
	this.set = function (DOM) {
		var name;
		
		// Sbarazziamoci dei namespace.
		DOM = stripNSPrefix (DOM);

		name = DOM.documentElement.nodeName;
		assert (name in DOMStorage, "ContentManager.set: " + name + " non e' una proprieta' valida.");

		DOMStorage[name] = DOM;
	}


	/*
	 * Reimposta a null il DOM precedentemente salvato.
	 * Si possono specificare piu' nomi
	 */
	this.clear = function (names) {
		for (var i = 0; i < arguments.length; i++) {
			assert (arguments[i] in DOMStorage, "ContentManager.set: " + arguments[i] + " non e' una proprieta' valida.");
			DOMStorage[arguments[i]] = null;
		}
	}


	this.reset = function () {

		var specialsLoaded = 0;
		var layoutListsLoaded = 0;
		var DOMAllLayouts = createDOM ("all-layouts");
		var elenco_layout;
		var elenco_layoutImported;
		var xslOpzioni;

		function redrawWhenReady () {
			if (specialsLoaded == staticSpecials.length
			    && xslOpzioni
			    && layoutListsLoaded == df.length) {

				for (var k = 0; k < df.length; k++) {
					// getElementsByTagName funziona in
					// due modi diversi in FF 2 e FF 3.
					elenco_layout = df[k].getLayouts().getElementsByTagName("df:elenco_layout")[0];
					if (!elenco_layout)
						elenco_layout = df[k].getLayouts().getElementsByTagName("elenco_layout")[0];
					elenco_layoutImported = DOMAllLayouts.importNode(elenco_layout, true);
					elenco_layoutImported.setAttribute ("df", k);
					elenco_layoutImported.setAttribute ("type", df[k].getContentType());
					DOMAllLayouts.documentElement.appendChild (elenco_layoutImported);
				}
				// trasformazione XSLT
				var optsToSend = xslTransform (DOMAllLayouts, xslOpzioni);
				
				/*
				var xPathQuery = '//li[text()=' + df[curDF].getCurrentLayout() + "]//li[text()=" + df[curDF].getCurrentSkin() + "]";
				alert("xPathQuery: " + xPathQuery);
				
				var optionToSelect = optsToSend.evaluate (xPathQuery, optsToSend, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE , null);
				alert("fatto: " + optionToSelect.snapshotLength + " risultati");
				optionToSelect.snapshotItem(0).setAttribute("selected","selected");
				
				alert("xPathQuery: " + xPathQuery + "\non node: " + opzioni + "\nselected: " + optionToSelect.snapshotitem(0));
				*/

				cm.set (optsToSend);
				var body = document.getElementsByTagName('body')[0];
				for (var index=0; index<body.childNodes.length; index++) 
					if (body.childNodes[index].nodeType == 1)
						body.removeChild(body.childNodes[index]);
				cm.redraw();
			}
		}

		// GET di DOM degli speciali statici.
		for (var i = 0; i < staticSpecials.length; i++) {
			var am = new AjaxManager (dirSpecials + "/" + staticSpecials[i] + ".xhtml",
					null,
					function (req) {
						specialsLoaded++;
						cm.set (req.responseXML);
						redrawWhenReady();
					},
					null);
			am.get();
		}

		// GET del DOM dell'xsl di opzioni.
		am = new AjaxManager (dirSpecials + "/opzioni.xsl",
				null,
				function (req) {
					xslOpzioni = req.responseXML;
					redrawWhenReady();
				},
				null);
		am.get();

		// GET dei DOM delle liste dei layout.
		for (var j = 0; j < df.length; j++) {
			df[j].refresh (null,
					function (req) {
						layoutListsLoaded++;
						redrawWhenReady ();
					},
					null);
		}
	}


	/*
	 * Ridisegna la pagina se chiamata senza argomenti, oppure le parti
	 * della pagina specificate.
	 */
	this.redraw = function (names) {
		var formatter = df[curDF];
		isFrag = !(names === undefined || names === null);
		var fc = new FormattaCreator (isFrag);
		if(arguments.length > 0){
			for(i=0;i<arguments.length;i++){
				fc.add (DOMStorage[arguments[i]]);
			}
			formatter.formatFragment (fc.getDOM(), emptyCorniceAndPutScapoccioneInDaFace, appendino, null);
		} else {
			for (key in DOMStorage) {
				if (DOMStorage[key])
					fc.add (DOMStorage[key]);
			}
			formatter.formatDocument (fc.getDOM(), emptyCorniceAndPutScapoccioneInDaFace, appendino, null);
		}
	}


	/*
	 * Ritorna il dom della richiesta formatta costruita a partire dai DOM
	 * del passo corrente.
	 */
	this.popupSaveBin = function (dfIndex, layout, skin) {
		var output;
		var fc = new FormattaCreator (false);

		for (key in DOMStorage)
			if (DOMStorage[key])
				fc.add (DOMStorage[key]);

		df[dfIndex].change (layout, skin);

		df[dfIndex].formatDocument (fc.getDOM (), null,
				function (req) {
					window.open (proxerize (req.responseText), 'tigella');
				},
				null);
	}

	DOMStorage = new Object ();

	// Preimpostiamo le proprieta' perche' seno' set si incazza.
	DOMStorage["scheda"] = null;
	DOMStorage["response"] = null;
	DOMStorage["errore"] = null;
	DOMStorage["logo"] = null;
	DOMStorage["navigazione"] = null;
	DOMStorage["opzioni"] = null;
	DOMStorage["info-pagina"] = null;
	DOMStorage["messaggio"] = null;
}
